/**
 * @param {number} n
 * @return {string[][]}
 */
 var solveNQueens = function(n) {
  const isValid = function(row,col,chessBoard,n){
    // 判断每一列有没有重复的
    for(let i = 0;i < row;i++){
      if(chessBoard[i][col] === 'Q'){
        return false
      }
    }
    // 判断对角线45°们不能是Q
    for(let i = row - 1,j = col - 1;i >= 0 && j >= 0 ;i--,j--){
      if(chessBoard[i][j] === 'Q'){
        return false
      }
    }
    for(let i = row - 1,j = col + 1;i >= 0 && j < n;i--,j++){
      if(chessBoard[i][j] === 'Q'){
        return false
      }
    }
    return true
  }
    const transformChessBoard = function(chessBoard){
      let chessBoardBack = [] // 定义结果数组
      chessBoard.forEach(row => { // 遍历棋盘的每一行
        let rowStr = '' // 生成一个空字符串
        row.forEach(value => { // 遍历每一行的元素
          rowStr += value // 让每一行的元素加上响应的值 将每一行的元素形成一个字符串
        })
        chessBoardBack.push(rowStr) // 放入结果数组中
      })
      return chessBoardBack // 返回结果数组
    }
    let result = []
    const backTracking = function(row,chessBoard){
      // 传入参数 第几行 棋盘
      if(row === n){
        // 如果传入的行数等于传入的值n 也就是到达了最底部
        result.push(transformChessBoard(chessBoard)) // 将棋盘插入到结果数组中
        return
      }
      for(let col = 0;col < n;col++){
        // 遍历每一行的每一个元素
        if(isValid(row,col,chessBoard,n)){ // 传入的是当前的行 当前的列 和棋盘元素 和n
          // 如果满足列不相等对角线不相等的条件
          chessBoard[row][col] = 'Q'
          backTracking(row+1,chessBoard) // 进入下一次递归
          chessBoard[row][col] = '.' // 退出递归进入修改成默认值.
        }
      }
    }
    
    let chessBoard = new Array(n).fill([]).map(()=>new Array(n).fill('.')) // 生成默认棋盘
    backTracking(0,chessBoard)
    return result
};